package cj.web.weixin.controllers;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.paoding.rose.web.annotation.Param;
import net.paoding.rose.web.annotation.Path;
import net.paoding.rose.web.annotation.rest.Get;
import net.paoding.rose.web.annotation.rest.Post;
import net.paoding.rose.web.var.Model;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import cj.utils.Base64;
import cj.utils.Constants;
import cj.utils.weixin.CheckUtil;
import cj.utils.weixin.HttpsWenXinUtil;
import cj.web.marry.dao.UserApplicationDAO;

/**
 * 婚典平台微信公众号开发
 * @author Administrator
 *
 */
@Path("marriage")
public class MarriageWeiXinController{
	
	private static Logger logger = Logger.getLogger(MarriageWeiXinController.class.getName());
	
	@Autowired
	private UserApplicationDAO userApplicationDAO;

	@Get("getweixincode")
	public String getWeiXinCode(Model model,@Param("code") String code) throws UnsupportedEncodingException
	{
		JSONObject jopublic =new JSONObject();
		//操作成功
		jopublic.put("returnFlag", Constants.returnObj.returnFlag_true);
		
		try {
			//Step1
//			model.add("code",code);
			//Step2
			String openid = HttpsWenXinUtil.retOpenId(code, Constants.weixinkey.AppID, Constants.weixinkey.AppSecret);
			
			return "r:/notes/marryNotes?openid="+openid;
		} catch (Exception e) {
			// TODO: handle exception
			logger.error("=============getWeiXinCode is "+e.getLocalizedMessage(),e);
			//1:flase
			jopublic.put("returnFlag", Constants.returnObj.returnFlag_flase);
			jopublic.put("returnMsg", "operation is error");
			
			return "r:/notes/marryNotes";
		}
	}
	
	/**
	 * 微信验证消息
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	@Get("weixinmarry")
	public void index(HttpServletRequest request, HttpServletResponse response) throws IOException {
		/*
		 * signature 微信加密签名， signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
		 * timestamp 时间戳 nonce 随机数 echostr 随机字符串
		 */
		String echostr = request.getParameter("echostr");
		if (echostr != null && CheckUtil.checkSignature(request)) {
			// 响应消息
			HttpsWenXinUtil.print(response,echostr);
		}
	}
	
	/**
	 * 微信发送消息Process
	 * @param request
	 * @param response
	 * @return
	 */
	@Post("weixinmarry")
	public String processRequest(HttpServletRequest request, HttpServletResponse response) {
		String respMessage = null;
		try {
			
			// xml请求解析
			Map<String, String> requestMap = HttpsWenXinUtil.parseXml(request);
			// 发送方帐号（open_id）
			String fromUserName = requestMap.get("FromUserName");
			// 公众帐号
			String toUserName = requestMap.get("ToUserName");
			// 消息类型
			String msgType = requestMap.get("MsgType");
			//返回内容
			String respContent = "";
			//幸福码
			String code = "";

			//获取微信用户信息------------
			List<Map> obj = userApplicationDAO.queryByOpenId(fromUserName);
			//不存在
			if(obj!=null && obj.size()>0)
			{
				code = obj.get(0).get("id").toString();
			}
			else
			{
				code = saveUserFengSi(fromUserName);
			}

			//------------微信事件判断
			if (msgType.equals(Constants.weixinkey.REQ_MESSAGE_TYPE_EVENT)) {
				// 事件类型
				String eventType = requestMap.get("Event");

				if (eventType.equals(Constants.weixinkey.EVENT_TYPE_SUBSCRIBE)) {
					// 关注
					
					/**
					 * Hi，我是小典君，终于等到你了呀！
						结婚预约、颁证仪式预约、观看视频号外、参与活动等请点击下方菜单栏；
						关注即得幸福码，您的幸福码是：  。
						回复“love”将自动获取幸福码。
						在婚姻登记处领证的新人请将幸福码递交给现场工作人员。
					 */
					
					/**
					 * 亲，你来了。你的幸福码是：
					 * 点击http://marriagewx.cjrbjt.com/Public/index.php，准确填写信息，免费获取长江日报结婚祝福号外。
					 * 婚典君热线85885655，欢迎来撩。
					 */
					respContent = "";
					StringBuffer contentMsg = new StringBuffer();
					contentMsg.append("亲，你来了。你的会员码是："+code).append("\n");
					contentMsg.append("回复“1”将自动获取会员码。").append("\n");
					contentMsg.append("点击http://marriage.haoyicn.cn/marrytj/main，准确填写信息，免费获取长江日报结婚祝福号外。").append("\n");
					contentMsg.append("婚典君热线85885655，欢迎来撩。");
					respContent = respContent+contentMsg.toString();
					
				} else if (eventType.equals(Constants.weixinkey.EVENT_TYPE_UNSUBSCRIBE)) {
					// 取消关注,用户接受不到我们发送的消息了，可以在这里记录用户取消关注的日志信息

				} 
//				else if (eventType.equals(EVENT_TYPE_CLICK)) {
//					// 事件KEY值，与创建自定义菜单时指定的KEY值对应
//					String eventKey = requestMap.get("EventKey");
//					System.out.println(eventKey);
//					// 自定义菜单点击事件
//					if ("wyyy".toUpperCase().equals(eventKey.toUpperCase())) {
//						System.out.println("-----"+eventKey);
//						respMessage="<xml>"
//								+ "<ToUserName><![CDATA["+toUserName+"]]></ToUserName>"
//								+ "<FromUserName><![CDATA["+fromUserName+"]]></FromUserName>"
//								+ "<CreateTime><![CDATA["+new Date().getTime()+"]]></CreateTime>"
//								+ "<MsgType><![CDATA["+REQ_MESSAGE_TYPE_EVENT+"]]></MsgType>"
//								+ "<Event><![CDATA["+RESP_MESSAGE_TYPE_VIEW+"]]></Event>"
//								+ "<EventKey><![CDATA[www.qq.com]]></EventKey>"
//								+ "</xml>";
//					} 
//				}
				
				respMessage = HttpsWenXinUtil.respMessage(fromUserName,toUserName,respContent,Constants.weixinkey.RESP_MESSAGE_TYPE_TEXT);
				
			} else if (msgType.equals(Constants.weixinkey.RESP_MESSAGE_TYPE_TEXT)) {
				String Content = requestMap.get("Content");
				// 自定义菜单点击事件
				if ("1".toUpperCase().equals(Content.toUpperCase())) {
					respContent = "您的会员码是："+code;
				}
				else if("七夕周大礼包".equals(Content))
				{
					respContent = "七夕周大礼包：http://t.cn/RtVzHWD";
					
				}
				else if("520大礼包".equals(Content))
				{
					respContent = "520大礼包：http://t.cn/RqFma3h";
					
				}
				else{
					StringBuffer msg = new StringBuffer();
					msg.append("从这里读懂中华好家风，一起接力传承。服务热线：85885655");
					respContent=msg.toString();
				}
				
				respMessage = HttpsWenXinUtil.respMessage(fromUserName,toUserName,respContent,Constants.weixinkey.RESP_MESSAGE_TYPE_TEXT);
			}
			
//			TextMessage textMessage = new TextMessage();
//			textMessage.setToUserName(fromUserName);
//			textMessage.setFromUserName(toUserName);
//			textMessage.setCreateTime(new Date().getTime());
//			textMessage.setMsgType(RESP_MESSAGE_TYPE_TEXT);
//			textMessage.setContent(respContent);
//			respMessage = MessageUtil.textMessageToXml(textMessage);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		HttpsWenXinUtil.print(response,respMessage);
		return "";
	}
	
	/**
	 * 保存用户粉丝信息
	 * @param openid
	 * @return 返回用户粉丝幸福码
	 */
	private String saveUserFengSi(String openid)
	{
		//获取微信access_token
		String access_token = HttpsWenXinUtil.initWeiXin(Constants.weixinkey.AppID,Constants.weixinkey.AppSecret);
		
		//获取用户信息
		//转换Json
		JSONObject jsUserObj =HttpsWenXinUtil.retWeixinUserInfo(access_token, openid);
		
		String nickname = Base64.getBase64(jsUserObj.get("nickname").toString());
		
		//幸福码Code
		int id = userApplicationDAO.create(0,jsUserObj.get("openid").toString(),
				nickname,
				jsUserObj.get("sex").toString(),jsUserObj.get("city").toString(),jsUserObj.get("province").toString(),
				jsUserObj.get("country").toString(),jsUserObj.get("headimgurl").toString());
		
		return String.valueOf(id);
	}
}
